//package com.nb.sse.controller;
//
//import com.nb.sse.entity.Message;
//import com.nb.sse.service.MessageService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.http.MediaType;
//import org.springframework.stereotype.Controller;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
//
//import java.io.IOException;
//import java.util.List;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
///*
//注意：
//线程管理：在这个例子中，我使用了ExecutorService来管理后台线程。这是为了避免阻塞Spring MVC的主线程。然而，在生产环境中，你应该更加谨慎地管理线程，避免创建过多的线程。
//消息标记为已读：在上面的streamMessages方法中，我注释了将消息标记为已读的代码。在实际应用中，你应该在发送消息后立即将它们从未读消息列表中移除或标记为已读。
//错误处理：我添加了基本的错误处理逻辑，以便在发送消息时发生异常时关闭SSE连接。
//性能优化：这个示例使用了简单的轮询来检查新消息。在更复杂的应用中，你可能希望使用更高效的消息推送机制，如WebSocket或基于事件的消息队列。
//安全性：确保你的应用通过HTTPS提供服务，并验证用户的身份。
//资源清理：在上面的代码中，我使用了finally块来确保即使在发生异常时也能关闭SSE连接。然而，在实际应用中，你还应该考虑如何优雅地关闭和清理不再使用的资源，如SseEmitter和ExecutorService中的线程。
//
//**/
//@Slf4j
//@Controller
//public class MessageController {
//
//    @Autowired
//    private MessageService messageService;
//
//    private ExecutorService executor = Executors.newCachedThreadPool();
//
//    @GetMapping(value = "/sse/messages", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public SseEmitter streamMessages(@RequestParam String userId) {
//        SseEmitter emitter = new SseEmitter(Long.MAX_VALUE); // 长时间超时
//
//        executor.submit(() -> {
//            try {
//                while (true) {
//                    List<Message> unreadMessages = messageService.getUnreadMessages(userId);
//                    if (!unreadMessages.isEmpty()) {
//                        for (Message message : unreadMessages) {
//                            emitter.send(SseEmitter.event().name("message").data(message.getContent()));
//                            // 在实际场景中，这里应该将这些消息标记为已读
//                        }
//                        // 如果需要，可以在这里清空已读消息的列表
//                    }
//                    // 等待一段时间再检查新消息，以避免过度轮询
//                    Thread.sleep(1000);
//                }
//            } catch (IOException | InterruptedException e) {
//                emitter.completeWithError(e);
//            } finally {
//                emitter.complete();
//            }
//        });
//
//        return emitter;
//    }
//}